import { login } from '@/api/user'
import { setToken, removeToken, getToken } from '@/utils/auth'
import { getUserInfo } from '@/api/user'
import { constantRoutes, resetRouter } from '@/router'
export default {
  namespaced: true, // 开启命名空间
  state: {
    // 取 token
    token: getToken(),
    // !#3
    userInfo: {}, // userInfo.username
    routes: constantRoutes || []
  },
  mutations: {
    setToken(state, token) {
      state.token = token
      // 存 token
      setToken(token)
    },
    removeToken(state) {
      state.token = null
      // 删除 token
      removeToken()
    },
    // !#2
    setUserInfo(state, userInfo) {
      state.userInfo = userInfo
    },
    removeUserInfo(state) {
      state.userInfo = {}
    },
    // filterRoutes => [{}, {}]
    setRoutes(state, filterRoutes) {
    // 不能用 push 方法，例如先登录了一个权限多的用户，其实这个时候 state.routes 里面就有了好多信息，下一个用户在这这个函数的时候用 push 的话还会在之前的基础上累加
      state.routes = [
        ...constantRoutes,
        ...filterRoutes,
        { path: '*', redirect: '/404', hidden: true }
      ]
    }
  },
  actions: {
    // payload => { mobile, password }
    async login(context, payload) {
      // 调用接口
      const token = await login(payload)
      context.commit('setToken', token)
    },
    // !#1
    async getUserInfo(context) {
      const userInfo = await getUserInfo()
      context.commit('setUserInfo', userInfo)
      return userInfo
    },
    logout(context) {
      context.commit('removeToken')
      context.commit('removeUserInfo')
      // 重置路由信息（router 里面的配置项 routes），和上个用户撇清关系
      resetRouter()
      // 我还想把当前用户筛选出来的在 Vuex 中的路由信息也清空
      context.commit('setRoutes', [])
      // !扩展：如果 routes 是放在 app.js 模块中的，这个时候我想在这情况该怎么做？
      // 参数1：模块名/mutation名字
      // 参数2：数据 payload
      // 参数3：{ root: true } 从根出发去查找
      context.commit('app/clearRoutes', [], {
        root: true
      })
    }
  }
}

